package com.itheima.health.security_config;


import com.itheima.health.security_service.HealthUserServiceDetailsImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * WebSecurityConfigurerAdapter  作用 ： 留给开发者  重写 框架的默认配置
 */
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)//   开启权限注解配置
public class HealthWebSecurityAdapter  extends WebSecurityConfigurerAdapter {

    //    spring ioc  容器 获取   UserDetailsService 接口实现类
    @Autowired
    HealthUserServiceDetailsImpl healthUserServiceDetailsImpl;


    /**
     *   重写 登录表单页面
     *
     *   配置类  角色ROLE_ 自动添加 不需要 我们额外手动添加
     */

    @Override
    protected void configure(HttpSecurity http) throws Exception {
           //  配置自定义登录表单
        http.formLogin().loginPage("/login.html").  //  目标登录页面
                loginProcessingUrl("/login.do").  //   表单提交的action地址
                failureUrl("/login.html").  //  认证失败自动跳转到该资源
                defaultSuccessUrl("/pages/main.html").  //  认证成功 跳转的资源
                and().  //  不同配置项 使用and 链接
                authorizeRequests().
                antMatchers("/pages/**","/template/**").authenticated(). //  只要要认证即可以访问
                and().exceptionHandling().accessDeniedPage("/error.html"). //   403  跳转到 目标页面 error.html
                and().logout().logoutUrl("/logout.do").invalidateHttpSession(true).logoutSuccessUrl("/login.html").//  登出配置说明
                and().headers().frameOptions().sameOrigin().//  配置iframe组件 可以被访问
                and().csrf().disable();//   禁用  默认 CsrfFilter过滤器  不会比对 token   <input name="_csrf" type="hidden" value="2c2576a9-e6b1-4fbb-a41d-588d831cf2b6" />
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //   注入数据库版 UserDetailsService实现类     并且密码采用加密方式
       auth.userDetailsService(healthUserServiceDetailsImpl).passwordEncoder(createBCryptPasswordEncoder());

    }


    /**
     *   获取密码加密器对象  BCryptPasswordEncoder
     */
    @Bean
    public BCryptPasswordEncoder createBCryptPasswordEncoder(){
        return  new BCryptPasswordEncoder();
    }


    //   配置静态资源  可以不需要认证 访问
    @Override
    public void configure(WebSecurity web) throws Exception {
       web.ignoring().antMatchers("/css/**","/img/**","/js/**","/plugins/**");
    }
}
